package org.dbp;

import java.io.Serializable;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
/**
 * 
 * En esta clase de utilidades tenemos métodos comunes para las reflexion en java.
 * 
 * @author David Blanco París
 *
 */
public class ReflectionDbpUtils {

	private static ReflectionDbpUtils instancia = new ReflectionDbpUtils();
	
	public static ReflectionDbpUtils getInstancia(){
		return instancia;
	}
	
	/**
	 * 
	 * Obtenemos los campos de una clase.
	 * 
	 * @param clasesFl
	 *            Es la clase de la que vamos a obtener todos los campos.
	 * @return
	 */
	public  <C extends Serializable> List<Field> obtenemosLosCamposDeUnaClase(
			final Class<C> clasesFl) {
		final List<Field> campos = new ArrayList<Field>();
		if (clasesFl != null) {
			for (Field campo : clasesFl.getFields()) {campos.add(campo);}
			for (Field campo : clasesFl.getDeclaredFields()) {campos.add(campo);}
		}
		return campos;
	}

	/**
	 * Obtiene los campos de una clase, que esten anotados de la clase.
	 * 
	 * @param clase		La clase con la que vamos a trabajar.
	 * @param anotacion	Es la anotación con la que vamos a trabajar.
	 * @return
	 */
	public  <C extends Serializable, T extends Annotation> List<Field> obtenemosLosCamposDeUnaClase(
			final Class<C> clase,final Class<T> anotacion) {
		final List<Field> valdev = new ArrayList<Field>();
		if(clase!=null){
			for(Field campo:obtenemosLosCamposDeUnaClase(clase)){
				if(campo.getAnnotation(anotacion)!=null){
					valdev.add(campo);
				}
			}
		}
		return valdev;
	}
}
